//
//  ViewController.m
//  KVC-KVO-Demo
//
//  Created by qianfeng001 on 15/8/3.
//  Copyright (c) 2015年 ZhangYunguang. All rights reserved.
//

#import "ViewController.h"
#import "AppModel.h"
#import "StudentModel.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    
    [self appModelKvc];
}
/*
 self.name = @"xiaohong";与_name = @"xiaohong";的区别 ，他们是否一样
 */
#pragma mark -- KVC
-(void)appModelKvc{
    AppModel *appModel = [[AppModel alloc] init];
    //kvc赋值  -- >都可调用
    //[appModel setValue:@"xiaohong" forKey:@"name"];
    //keyPath 写属性路径字符串   一般推荐使用这个方法
    [appModel setValue:@"xiaohong" forKeyPath:@"name"];
    //对内部的下划线进行赋值
    [appModel setValue:@(100) forKeyPath:@"count"];
    /*
        对一个  xxx AppModel中没有的属性进行赋值时会调用setValue: forUndefinedKey
     */
    
    /*
        kvc赋值原理
     [appModel setValue:@"xiaohong" forKeyPath:@"name"];
     首先，调用上述方法的时候首先会去appModel指向对象的类中去找有没有setName:(setter)方法，有就调用，如果没有就去找又没有成员变量_name，有就直接赋值，如果没有去找成员变量名name，有就赋值，如果没有就取调用setValue: forUndefinedKey，如果这个方法没有实现，则成员会crash掉，程序崩溃，为了防止崩溃，对找不到key对应的属性实现setValue: forUndefinedKey这个方法就可以了
     */
    [appModel setValue:@"xxx" forKeyPath:@"xxx"];
    
    [appModel print];
    
    //kvc 获取对象属性值
    NSString *name = [appModel valueForKeyPath:@"name"];
    int count = [[appModel valueForKeyPath:@"_count"] intValue];
    NSString *sss = [appModel valueForKeyPath:@"vvv"];
    NSLog(@"name:%@",name);
    NSLog(@"count:%d",count);
    
    /*
        kvc获取值的原理
     
     调用上述方法，首先找AppModel类中有没有-（NSstring）name方法（getter方法）,如果有就调用，如果没有就去找有没有_name成员变量，如果有就直接获取值
     */
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
